package cn.sccl.jdbc.analysis;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * @author 饶爽
 * @time 2019年9月14日 下午5:42:53
 * @version 1.0.0
 * 原始的jdbc访问数据库,实际开发中带来的问题解析
*/
public class JdbcAnalysisDemo {
    //原始jdbc
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        try {
            // 加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 通过驱动管理类获取数据库链接
            String url = "jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8";
            conn = DriverManager.getConnection(url,"root","root");
            // 定义sql语句 ?表示占位符
            String sql = "select * from t_user where username = ?";
            // 获取预处理statement
            st = conn.prepareStatement(sql);
            // 设置参数，第一个参数为sql语句中参数的序号（从1开始），第二个参数为设置的参数值
            st.setString(1, "王五");
            // 向数据库发出sql执行查询，查询出结果集
            rs = st.executeQuery();
            // 遍历查询结果集
            while (rs.next()) {
                System.out.println(rs.getShort(1)+","+rs.getString(2)); 
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            // 释放资源
            if (rs != null) {
               try {
                rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                } 
            }if (st != null) {
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    //问题归集：
    //问题出处
    //1、  数据库连接创建、释放频繁造成系统资源浪费，从而影响系统性能。如果使用数据库连接池可解决此问题。
    //2、  Sql语句在代码中硬编码，造成代码不易维护，实际应用中sql变化的可能较大，sql变动需要改变java代码。
    //3、  使用preparedStatement向占有位符号传参数存在硬编码，
    //      因为sql语句的where条件不一定，可能多也可能少，修改sql还要修改代码，系统不易维护。
    //4、  对结果集解析存在硬编码（查询列名），sql变化导致解析代码变化，系统不易维护，
    //      如果能将数据库记录封装成pojo对象解析比较方便。
}
